package com.example.anpnovel.handler;

import com.example.anpapi.entity.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 文件上传大小超限异常处理
     * @param ex 异常对象
     * @return 错误响应
     */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public R<String> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException ex) {
        log.error("文件上传大小超限: {}", ex.getMessage());
        return R.error("文件大小超过限制，单个文件最大支持50MB，请压缩文件后重试");
    }

    /**
     * 文件上传格式错误异常处理
     * @param ex 异常对象
     * @return 错误响应
     */
    @ExceptionHandler(FileUploadException.class)
    public R<String> handleFileUploadException(FileUploadException ex) {
        log.error("文件上传格式错误: {}", ex.getMessage());
        return R.error("请求格式错误，请确保使用正确的Content-Type（JSON接口应使用application/json）");
    }

    /**
     * 数据库唯一约束违反异常处理
     * @param ex 异常对象
     * @return 错误响应
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) {
        log.error("数据库约束违反: {}", ex.getMessage());

        if (ex.getMessage().contains("Duplicate entry")) {
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在，请重新操作";
            return R.error(msg);
        }
        return R.error("数据操作失败，请检查数据是否已存在");
    }

    /**
     * 通用异常处理
     * @param ex 异常对象
     * @return 错误响应
     */
    @ExceptionHandler(Exception.class)
    public R<String> handleException(Exception ex) {
        log.error("系统异常: ", ex);
        return R.error("系统异常，请联系管理员");
    }
}

